package com.hg.hggood.mapper;

import com.hg.hggood.entity.Order;
import com.hg.hggood.entity.OrderItem;
import com.hg.hggood.vo.OrderVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**订单的持久层接口*/
public interface OrderMapper {

    /**
     * 插入订单数据
     * @param order 订单数据
     * @return 受影响的行数
     */
    Integer insertOrder(Order order);

    /**
     * 插入订单项的数据
     * @param orderItem 订单项数据
     * @return 受影响的行数
     */
    Integer insertOrderItem(OrderItem orderItem);

    List<OrderVO> findVOByUid(Integer uid);

    /**根据订单id删除订单信息的业务需要*/
    Integer countByUid(Integer uid);
    /**
     *  根据订单id来删除订单信息
     * @param oid 创建订单id号
     * @return  受影响的行数
     */
    Integer deleteByOid(Integer oid);

    /**根据订单详情的id删除订单详情的信息的业务需要
     * 通过id去找oid,再通过oid去找uid检查是否非法访问*/
    OrderItem findItemById (Integer id);
    Order findByOid(Integer oid);
    /**
     * 根据订单详情的id删除订单详情的信息
     * @param id    订单详情的id号
     * @return  受影响的行数
     */
    Integer deleteById(Integer id);

    /**
     *      * @Param("SQL映射文件中#{}占位符的变量名"):解决的问题是当SQL语句的占位符
     *      * 和映射的接口方法参数名不一致时,需要将某个参数强行注入到某个占位符变量上时,
     *      * 可以用@Param这个注解来标注映射的关系
     * @param oid   订单的id
     * @param totalPrice    某个id订单总价
     * @param modifiedUser  某个id订单最后修改者(管理员或者用户)
     * @param modifiedTime  某个id订单最后修改时间
     * @return  受影响的行数
     */
    Integer updateTotalPriceByOid(
                            @Param("oid") Integer oid,
                            @Param("totalPrice") Double totalPrice,
                            @Param("modifiedUser") String modifiedUser,
                            @Param("modifiedTime") Date modifiedTime);

    /**根据订单详情id删除信息的业务需要*/
    Integer countByOid(Integer oid);

    Integer updateStatusByOid (
            @Param("oid") Integer oid,
            @Param("status") Integer status,
            @Param("payTime") Date payTime,
            @Param("modifiedUser") String modifiedUser,
            @Param("modifiedTime") Date modifiedTime
    );

    List<OrderItem> findItemByOid (Integer oid);
}
